package com.example.docmanagement.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 用户注册请求 DTO
 * 用于新用户注册账号
 * 
 * 示例 JSON:
 * {
 * "email": "newuser@example.com",
 * "username": "zhangsan",
 * "password": "password123",
 * "fullName": "张三"
 * }
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Schema(description = "用户注册请求")
public class RegisterRequest {

    /**
     * 邮箱地址（必填）
     * 用户的邮箱地址，必须符合邮箱格式
     * 系统会检查邮箱唯一性，不允许重复注册
     * 邮箱可用于登录和找回密码
     * 格式要求：符合标准邮箱格式（如：user@example.com）
     * 示例："newuser@example.com"
     */
    @Schema(description = "邮箱地址", example = "newuser@example.com", required = true, format = "email")
    @NotBlank(message = "邮箱不能为空")
    @Email(message = "邮箱格式不正确")
    private String email;

    /**
     * 用户名（必填）
     * 用户的登录名称，必须唯一
     * 长度限制：3-50个字符
     * 建议使用字母、数字、下划线组合
     * 用户名可用于登录和在系统中显示
     * 示例："zhangsan"、"user_001"
     */
    @Schema(description = "用户名", example = "zhangsan", required = true, minLength = 3, maxLength = 50)
    @NotBlank(message = "用户名不能为空")
    @Size(min = 3, max = 50, message = "用户名长度必须在3-50个字符之间")
    private String username;

    /**
     * 登录密码（必填）
     * 用户账号的登录密码
     * 长度要求：至少6个字符
     * 建议：使用字母、数字、特殊字符组合以提高安全性
     * 注意：密码通过HTTPS传输，后端会进行BCrypt加密存储
     * 示例："password123"（生产环境建议使用更复杂的密码）
     */
    @Schema(description = "登录密码", example = "password123", required = true, minLength = 6, format = "password")
    @NotBlank(message = "密码不能为空")
    @Size(min = 6, message = "密码长度至少为6个字符")
    private String password;

    /**
     * 真实姓名（可选）
     * 用户的真实姓名或昵称
     * 用于在系统中显示更友好的名称
     * 如果不提供，系统将使用用户名作为显示名称
     * 示例："张三"
     */
    @Schema(description = "真实姓名", example = "张三", required = false)
    private String fullName;
}
